package com.baseballgame.server;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Socket;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * Swing의 Frame 상속받고 이벤트를 발생시키기 위해 ActionListener 구현함
 *
 */
@SuppressWarnings("serial")
public class ServerChatFrame extends JFrame implements ActionListener {
	
	private JPanel commandPanel, messagePanel;
	//private JTextArea messageList;
	//private JTextField message;
	private JButton startButton, stopButton;//, sendButton;
	private String maxConn;
	private String ruleConf;
	private String Id;
	private int count;
	
	String[] randNum = new String[3];
	
	//소켓정보를 받기 위한 ListeningThread 클래스 참조 선언
	private ListeningThread listener;
	
	private LinkedList<ServerNetUnit> clients;
	
	//생성자 메서드(데이터 보내기/받기 컬렉션 초기화 및 자동 메서드 실행)
	public ServerChatFrame() {
		clients = new LinkedList<ServerNetUnit>();
		count = 0;
		init();
	}
	private void init() {
		
		setTitle("채팅서버");
		setSize(500, 100);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//1. 상단 명령 버튼 구성 (서버시작, 서버종료)
		commandPanel = new JPanel();
		startButton = new JButton("서버 시작");
		startButton.setPreferredSize(new Dimension(150, 30));
		startButton.addActionListener(this);//시작 이벤트
		commandPanel.add(startButton);
		
		stopButton = new JButton("서버 중지");
		stopButton.setPreferredSize(new Dimension(150, 30));
		stopButton.setEnabled(false);
		stopButton.addActionListener(this);//중지 이벤트
		commandPanel.add(stopButton);
		add(commandPanel, BorderLayout.NORTH);
		
		//2. 채팅 데이터 표시 영역 구성
		//messageList = new JTextArea();
		//messageList.setEditable(true);
		//JScrollPane messagePane = new JScrollPane(messageList);//스크롤 지원 컴포넌트
		//add(messagePane, BorderLayout.CENTER);
		
		//3. 메시지 입력 요소 구성(텍스트필드, 버튼)
//		messagePanel = new JPanel();
//		message = new JTextField();
//		message.setPreferredSize(new Dimension(400, 30));
//		message.setEditable(false);
//		messagePanel.add(message);
//		sendButton = new JButton("전송");
//		sendButton.setPreferredSize(new Dimension(70, 30));
//		sendButton.setEnabled(false);
//		sendButton.addActionListener(this);
//		messagePanel.add(sendButton);
//		add(messagePanel, BorderLayout.SOUTH);
		
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		//e.getSource() : 이벤트를 발생시킨 객체
		if(e.getSource() instanceof JButton){
			JButton button = (JButton)e.getSource();
			if(button.getText().equals("서버 시작")){
				//시작 버튼 눌렸을 때 처리할 코드
				//리스너 생성 -> 쓰레드 시작 -> Accept
				listener = new ListeningThread(this);//frame 보냄
				listener.start();
				
				toggleControlState(true);
				logMessage("***** 서버가 시작 되었습니다. *****");
			}else if(button.getText().equals("서버 중지")){
				//중지 버튼 눌렸을 때 처리할 코드
				listener.doStop();//리스너 해제
				closeAllClient();//소켓 해제
				
				toggleControlState(false);
				logMessage("***** 서버가 중지 되었습니다. *****");
			}else{
				//메시지 송신
			}
		}
	}
	//접속된 모든 클라이언트 연결 종료 / 목록에서 제거
	private void closeAllClient() {
		
		synchronized(clients){
			int count = clients.size();
			for(int i = count - 1; i >= 0; i--){
				try{
					clients.get(i).doStop();
				}catch(Exception ex){}
				clients.remove(i);
			}
		}
		
	}
	
	private void logMessage(String message) {
		//System.out.println("클라이언트에서 준 메시지 : " + message);
		//messageList.append(message);
		//messageList.append("\n");
	}
	
	private void toggleControlState(boolean started) {
		startButton.setEnabled(!started);
		stopButton.setEnabled(started);
		//message.setEditable(started);
		//sendButton.setEnabled(started);
	}
	
	//ListeningThread에서 client가 연결 되었을 때 호출할 메서드
	public void addClient(Socket socket){
		try{
			ServerNetUnit client = new ServerNetUnit(this, socket);
			client.start();//수신 작업 시작
			synchronized(clients){
				clients.add(client);
			}
			
			//broadcastMessage(client, String.format("***** %s님이 접속했습니다. *****", client.getClientName()));
		}catch(Exception e){}
	}
	
	//NetUnit에서 메시지 수신했을 때 호출할 메서드
	public void processMessage(ServerNetUnit client, String message){
		String message2 = String.format("[%21s]:%s", client.getClientName(), message);
		logMessage(message2);
		
		//broadcastMessage(client, message2);
	}
	
	public void processConnect(String maxConn, String ruleConf, String Id){
		this.maxConn = maxConn;
		this.ruleConf = ruleConf;
		this.Id	= Id;
		
		for(int i = 0; i < 3; i++ ){
			randNum[i] = String.valueOf((int)(Math.random() * 9));
			
			for(int j = 0; j < i; j++){ 
				if(randNum[j].equals(randNum[i])){
					i--;
					break;
				}
			}
		}
	}
	
	public void processConnect(ServerNetUnit client, String num1, String num2, String num3){
		int strikeCnt = 0;
		int ballCnt = 0;
		String gameServerMessage;
		boolean gameOverMessage = false;
		
		if(randNum[0].equals(num1)){
			strikeCnt++;
		}
		
		if(randNum[1].equals(num2)){
			strikeCnt++;
		}
		
		if(randNum[2].equals(num3)){
			strikeCnt++;
		}
		
		if(strikeCnt == 3){
			gameOverMessage = true;
		}
		
		for(int i = 0; i < randNum.length ; i++){
			if(!randNum[0].equals(num1) && randNum[i].equals(num1)){
				ballCnt++;
			}
			
			if(!randNum[1].equals(num2) && randNum[i].equals(num2)){
				ballCnt++;
			}
			
			if(!randNum[2].equals(num3) && randNum[i].equals(num3)){
				ballCnt++;
			}
		}
		
		count++;
		
		if(gameOverMessage){
			gameServerMessage = "종료";
		}else{
			gameServerMessage = String.valueOf(count).concat(" 회차 = ").concat(String.valueOf(strikeCnt).concat("S").concat(" ").concat(String.valueOf(ballCnt)).concat("B"));
		}
		
		//System.out.println("gameServerMessage = " + randNum[0]+randNum[1]+randNum[2] +" "+ gameServerMessage);
		client.doSend(gameServerMessage);
	}
	
	// 각 클라이언트로 메세지 뿌려주는 메서드
	/*public void broadcastMessage(ServerNetUnit client, String message){
		synchronized(clients){
			int count = clients.size();
			for(int i = count - 1; i >= 0; i--){
				ServerNetUnit thisClient = clients.get(i);
				
				System.out.println("!!!");
				if(thisClient != client){
					System.out.println("!!!!!!!");
					try{
						
						thisClient.doSend(message);
					} catch(Exception ex){
						thisClient.doStop();
						clients.remove(thisClient);
					}
				}
			}
		}
	}*/
}